﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BLToolkit.Data;
using Data_Access_Layer;
using System.Data.SqlTypes;
using System.IO;
using log4net;
using log4net.Config;

using Business_Layer;
using DevComponents.DotNetBar.Controls;

namespace CaffeBillard
{
    public partial class FormWorking : DevComponents.DotNetBar.Office2007Form
    {
        //Tạo đối tượng log4net
        protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public FormWorking()
        {
            InitializeComponent();
            dgvArtChanged.AutoGenerateColumns = false;
        }
        #region Khai báo
        //Tạo biến để xử lý orderdetail
        private OrderDetailController _detail;
        //Tạo biến để xử lý order
        private OrderController _order;
        //Tạo biến để xử lý Desk
        private DeskController _deskController;
        private Utility _com;
        //Biến để lưu trạng thái của datagridview
        private bool _cur;
        //Tạo biến để lấy mã bàn từ form chuyển bàn
        public static int deskid;
       
        //Tạo biến để lưu số lượng ban đầu;
        private int quantity;
        //Lấy tên nhân viên đang sử dụng
        private string name;

        #endregion
      
        //Load form
        private void WorkingForm_Load(object sender, EventArgs e)
        {
            name =
                Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).Name.ToString
                    ();
            RT();
            lblId.Text = "";
            lblBan.Text = "";
            _detail = new OrderDetailController();
            _order= new OrderController();
            _deskController= new DeskController();
            Load_Desk();
            Load_Article();
            timerThoiGian.Start();
            gb1.BackColor = Color.FromArgb(194, 217, 247);
            _com = new Utility();
        }
        

        #region Menu chuột phải
        //Khi chọn menu khởi động bàn thì tiến hành bật bàn và tạo hóa đơn rỗng
        private void khởiĐộngBànToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                XmlConfigurator.Configure();
                log.Info("Nhan vien: "+ name +"  khoi dong ban " + lblBan.Text);
                var ban = contextMenuStrip1.SourceControl as Label;
                var result = _deskController.FindById(int.Parse(ban.Name));
                //Tạo hóa đơn

                lblStart.Text = DateTime.Now.ToString();
                //Cập nhật cho bàn
                UpdateDesk(int.Parse(ban.Name), result[0].Price, result[0].DeskName, result[0].DeskType,
                           Convert.ToDateTime(lblStart.Text), true);
                //Thêm mới một hóa đơn
                InsertOrUpdateOrder(0, DateTime.Now, int.Parse(ban.Name), WorkSession.Current.CurrentAccount.EmpId, Convert.ToDateTime(lblStart.Text), null, 0,
                                    0, 0, false,"");
                var or = Order.Objects.Where(x => x.TimeIn == Convert.ToDateTime(lblStart.Text)).ToList();
                if (or.Count > 0)
                {
                    lblStop.Text = or[0].TimeOut.ToString();
                    lblhd.Text = or[0].Id.ToString();
                    Total_Cash(or[0].TimeIn, DateTime.Now, result[0].Price);
                }

                ban.ImageIndex = 1;
                gbArt.Enabled = true;
                gbCash.Enabled = true;
                ChuyenBanToolStripMenuItem.Enabled = true;
                hủyBànToolStripMenuItem.Enabled = true;
                kếtThúcBànToolStripMenuItem.Enabled = true;
                khởiĐộngBànToolStripMenuItem.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }
        }


        //Kết thúc bàn
        private void kếtThúcBànToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                XmlConfigurator.Configure();
                log.Info("Nhan vien: "+name+" ket thuc ban " + lblBan.Text);
                var ban = contextMenuStrip1.SourceControl as Label;
                var result = _deskController.FindById(int.Parse(ban.Name));
                lblStop.Text = DateTime.Now.ToString();
                //Cập lại bàn
                UpdateDesk(int.Parse(ban.Name), result[0].Price, result[0].DeskName, result[0].DeskType,
                           result[0].TimeIn, false);
                //Thêm mới một hóa đơn
                var or = _order.FindById(int.Parse(lblhd.Text), true);
                InsertOrUpdateOrder(int.Parse(lblhd.Text), or[0].OrderDate, int.Parse(ban.Name), 1, or[0].TimeIn,
                                    Convert.ToDateTime(lblStop.Text), or[0].Discount, or[0].Cash, or[0].Total, false,"");
                ban.ImageIndex = 0;
                ChuyenBanToolStripMenuItem.Enabled = false;
                hủyBànToolStripMenuItem.Enabled = false;
                kếtThúcBànToolStripMenuItem.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }
        }

      
        #endregion

        #region Thêm, cập nhật, xóa


        //Thêm hoặc cập nhật lại hóa đơn
        private void InsertOrUpdateOrder(int oId, DateTime date, int? desk, int emp, DateTime? timein, DateTime? timeout, float dis, float cash, float total,bool stt,string note)
        {
            try
            {
                Order _ord = new Order();
                _ord.Id = oId;
                _ord.DeskId = desk;
                _ord.Type = true;
                _ord.OrderDate = date;
                _ord.EmpId = emp;
                _ord.TimeIn = timein;
                _ord.TimeOut = timeout;
                _ord.Cash = cash;
                _ord.Discount = dis;
                _ord.Total = total;
                _ord.Status = stt;
                _ord.Deleted = false;
                _ord.Notes = note;
                _order.InsertOrUpdate(_ord);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }

        }

        //Cập nhật lại bàn
        private void UpdateDesk(int id, float pri, string name, string type, DateTime? timein, bool stt)
        {
            Desk _desk = new Desk();
            _desk.Id = id;
            _desk.Price = pri;
            _desk.DeskName = name;
            _desk.DeskType = type;
            _desk.TimeIn = timein;
            _desk.Status = stt;
            _deskController.InsertOrUpdate(_desk);
        }




        //Kiểm tra dữ liệu nhập vào
        private void dgvArtChanged_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (dgvArtChanged.IsCurrentRowDirty && e.ColumnIndex > 0)
                {
                    var _d = dgvArtChanged.Rows[e.RowIndex];
                    int n = 0;
                    if (_d.Cells[3].Value == null || _d.Cells[4].Value == null)
                    {
                        MessageBox.Show("Không được để trống dữ liệu!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }

                    else if (!int.TryParse(_d.Cells[4].Value.ToString(), out n))
                    {
                        MessageBox.Show("Số lượng phải là một số nguyên!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    else if (int.Parse(_d.Cells[4].Value.ToString()) == 0)
                    {
                        MessageBox.Show("Số lượng phải lớn hơn 0", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    else if (_d.Cells[3].Value != null)
                    {
                        var result =
                        Article.Objects.Where(x => x.Id == int.Parse(_d.Cells[3].Value.ToString())).Select(x => x.Price).ToList();
                        float a = result[0]*20/100;
                        _d.Cells[5].Value = (result[0] + a).ToString();

                    }
                    _d.Cells[6].Value = int.Parse(_d.Cells[4].Value.ToString()) *
                                        float.Parse(_d.Cells[5].Value.ToString());
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n"+ex.Message, "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
            }
            _cur = dgvArtChanged.IsCurrentRowDirty;
        }

        //Thêm hoặc cập nhật cho chi tiết hóa đơn
        private void dgvArtChanged_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (_cur)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info("Nhan vien: "+name+" them do uong cho ban " +lblBan.Text);
                    var d = dgvArtChanged.Rows[e.RowIndex];
                    OrderDetail _order = new OrderDetail();
                    _order.Id = int.Parse(d.Cells[1].Value.ToString());
                    _order.OrderId = int.Parse(lblhd.Text);
                    _order.ArtId = int.Parse(d.Cells[3].Value.ToString());
                    _order.Quantity = int.Parse(d.Cells[4].Value.ToString());
                    _order.Price = float.Parse(d.Cells[5].Value.ToString());
                    _order.Deleted = false;
                    var a = Article.Objects.Where(x => x.Id == _order.ArtId).ToList();

                    if (a[0].Quantity > Math.Abs(_order.Quantity - quantity))
                    {
                        _detail.InsertOrUpdate(_order);
                        LoadOrderDetail();
                        var b = _deskController.FindById(int.Parse(lblId.Text));
                        Total_Cash(Convert.ToDateTime(lblStart.Text), DateTime.Now, b[0].Price);
                        UpdateArt(_order.ArtId,_order.Quantity - quantity);
                        WorkSession.Current.CurrentArticle.Add(a[0]);
                    }
                    else if (a[0].Quantity < Math.Abs(_order.Quantity - quantity))
                    {
                        LoadOrderDetail();
                        MessageBox.Show(
                            "Số lượng " + a[0].ArtName + " hiện có trong kho là " + a[0].Quantity +
                            " nhỏ hơn số bạn yêu cầu, hãy nhập thêm hàng để sử dụng!!!",
                            "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Question);
                    }
                    if(a[0].Quantity == Math.Abs(_order.Quantity - quantity))
                    {
                        MessageBox.Show("Số lượng " + a[0].ArtName + " đã hết, hãy nhập thêm hàng để sử dụng");
                        LoadOrderDetail();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi : \n" + ex.Message);
                }
            }
            _cur = false;
        }


        //Cập nhật lại số lượng khi thêm hoặc cập nhật chi tiết hóa đơn
        private void UpdateArt(int id,int quantity)
        {
            try
            {
                var a = Article.Objects.Where(x => x.Id == id).ToList();
                Article art= new Article();
                art.Id = id;
                art.ArtName = a[0].ArtName;
                art.Price = a[0].Price;
                art.Unit = a[0].Unit;
                art.SupId = a[0].SupId;
                art.Quantity =a[0].Quantity - quantity;
                art.Deleted = false;
                Article.Objects.Update(art);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n"+ex.Message);
            }
        }


        //Sự kiện khi chọn một dòng trên datagridview
        private void dgvArtChanged_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvArtChanged.CurrentRow.Cells[4].Value!=null)
                 quantity = int.Parse(dgvArtChanged.CurrentRow.Cells[4].Value.ToString());
            else
            {
                quantity = 0;
            }
        
            if (e.ColumnIndex == 0 && e.RowIndex != -1)
            {
                
                if (dgvArtChanged.CurrentRow.Cells[1].Value != null && dgvArtChanged.CurrentRow.Cells[1].Value.ToString()!="0")
                {
                    int id = int.Parse(dgvArtChanged.CurrentRow.Cells[1].Value.ToString());
                   
                    if (
                        MessageBox.Show("Bạn có chắc muốn xóa không?", "Thông báo", MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        try
                        {
                            var row = OrderDetail.Objects.Where(x => x.Id == id).ToList();
                            row[0].Deleted = true;
                            _detail.Delete(row[0]);
                            LoadOrderDetail();
                            var b = _deskController.FindById(int.Parse(lblId.Text));
                            Total_Cash(Convert.ToDateTime(lblStart.Text), DateTime.Now, b[0].Price);
                            XmlConfigurator.Configure();
                            log.Info("Nhan vien: " + name + " hủy đồ uống cho bàn " + lblBan.Text);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Lỗi :\n" + ex.Message);
                        }
                    }
                }
            }
        }

        #endregion

        #region Các thao tác, sự kiện khác


        //Khi rê chuột vào bàn nào đó thì hiển thị thông tin bàn lên
        void lbl_MouseHover(object sender, EventArgs e)
        {
            Label lbl = (Label)sender;
            var desk = _deskController.FindById(int.Parse(lbl.Name));
            string stt = (desk[0].Status == true) ? "Đang bận" : "Đang rỗi";
            string s = "Loại bàn: " + desk[0].DeskType + "\nGiá bàn: " + desk[0].Price + "\nTrạng thái: " + stt;
            toolTip1.SetToolTip(lbl, s);
        }

       

        //In hóa đơn và thanh toán
        private void btnIn_Click(object sender, EventArgs e)
        {
            try
            {
                XmlConfigurator.Configure();
                log.Info("Nhan vien: "+name+" in hoa don va tinh tien cho ban " + lblBan.Text);
                if (lblStop.Text == "")
                    MessageBox.Show("Bạn phải kết thúc bàn trước khi thanh toán", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else if (MessageBox.Show("Tiến hành thanh toán?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    float n = 0;
                    var or = _order.FindById(int.Parse(lblhd.Text), true);
                    float tg;
                    if (float.TryParse(lblTG.Name, out n))
                        tg = float.Parse(lblTG.Name);
                    else
                        tg = 0;
                    InsertOrUpdateOrder(or[0].Id, or[0].OrderDate, or[0].DeskId, or[0].EmpId, or[0].TimeIn, Convert.ToDateTime(lblStop.Text), tg, float.Parse(lblTB.Name) +float.Parse(lblBT.Name), float.Parse(lblT.Name), true,or[0].Notes);
                    var result = _deskController.FindById(int.Parse(lblId.Text));
                    UpdateDesk(int.Parse(lblId.Text), result[0].Price, result[0].DeskName, result[0].DeskType, null, false);
                    if (printDialog1.ShowDialog() == DialogResult.OK)
                    {
                        printDocument1.Print();
                        Load_Desk();
                        RT();
                        dgvArtChanged.Rows.Clear();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }
           
        }

        //Sự kiện click lên bàn
        void lbl_Click(object sender, EventArgs e)
        {
            try
            {
                XmlConfigurator.Configure();
                log.Info("Nhan vien: " + name + "xem ban " + lblBan.Text);
                Label lbl = (Label) sender;
                var result = _deskController.FindById(int.Parse(lbl.Name));

                lblId.Text = lbl.Name;
                lblBan.Text = result[0].DeskName;
                if (result[0].TimeIn != null)
                {
                    var or = Order.Objects.Where(x => x.TimeIn == result[0].TimeIn).ToList();
                    if (or.Count > 0)
                    {
                        if (result[0].Status || !or[0].Status)
                        {
                            lblStart.Text = result[0].TimeIn.ToString();
                            or = Order.Objects.Where(x => x.TimeIn == result[0].TimeIn).ToList();
                            lblStop.Text = or[0].TimeOut.ToString();
                            lblhd.Text = or[0].Id.ToString();
                            LoadOrderDetail();
                            Total_Cash(Convert.ToDateTime(lblStart.Text), DateTime.Now, result[0].Price);
                            gbArt.Enabled = true;
                            gbCash.Enabled = true;
                            ChuyenBanToolStripMenuItem.Enabled = true;
                            hủyBànToolStripMenuItem.Enabled = true;
                            kếtThúcBànToolStripMenuItem.Enabled = true;
                            khởiĐộngBànToolStripMenuItem.Enabled = false;
                        }
                        if (!or[0].Status && !result[0].Status)
                        {
                            ChuyenBanToolStripMenuItem.Enabled = false;
                            hủyBànToolStripMenuItem.Enabled = false;
                            kếtThúcBànToolStripMenuItem.Enabled = false;
                            khởiĐộngBànToolStripMenuItem.Enabled = false;
                        }
                        if (!result[0].Status)
                        {
                            ChuyenBanToolStripMenuItem.Enabled = false;
                            hủyBànToolStripMenuItem.Enabled = false;
                            kếtThúcBànToolStripMenuItem.Enabled = false;
                        }
                    }
                }
                else
                {
                    khởiĐộngBànToolStripMenuItem.Enabled = true;
                    RT();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }

        }

        //Reset các control về rỗng hoặc enabled=false
        private  void RT()
        {
            lblStart.Text = "";
            lblStop.Text = "";
            lblhd.Text = "";
            lblThoiGian.Text = "";
            lblTienBan.Text = "";
            lblTienDoUong.Text = "";
            lblTongTien.Text = "";
            lblTienChu.Text = "";
            lblTong.Text = "";
            lblGiam.Text = "";
            txtGiam.Text = "";
            lblBanTruoc.Text = "";
            lblTienThua.Text = "";
            txtTienThua.Text = "";
            gbArt.Enabled = false;
            gbCash.Enabled = false;
            ChuyenBanToolStripMenuItem.Enabled = false;
            hủyBànToolStripMenuItem.Enabled = false;
            kếtThúcBànToolStripMenuItem.Enabled = false;
        }

        //Sau mỗi phút sẽ cập nhật lại số tiền bàn cũng như thời gian sử dụng của bàn đó
        private void timerThoiGian_Tick(object sender, EventArgs e)
        {
            if (lblId.Text != "" && lblStart.Text!="")
            {
                var b = _deskController.FindById(int.Parse(lblId.Text));
                Total_Cash(Convert.ToDateTime(lblStart.Text), DateTime.Now, b[0].Price);
            }
        }




        //Khi khách yêu cầu chuyển bàn thì chuyển qua bàn mới 
        private void ChuyenBanToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormMoveDesk frm = new FormMoveDesk();
            frm.Show();
            frm.Closed += frm_Closed;
        }

        //Khi form chuyển bàn đóng thì tiến hành chuyển qua bàn chỉ địnhy
        void frm_Closed(object sender, EventArgs e)
        {
            try
            {
                if (deskid != 0)
                {
                    var d = _deskController.FindById(int.Parse(lblId.Text));
                    var d1 = _deskController.FindById(deskid);
                    var or = _order.FindById(int.Parse(lblhd.Text), true);
                    UpdateDesk(int.Parse(lblId.Text), d[0].Price, d[0].DeskName, d[0].DeskType, null, false);
                    DateTime date = DateTime.Now;
                    UpdateDesk(deskid, d1[0].Price, d1[0].DeskName, d1[0].DeskType, date, true);
                    string note = "Chuyển từ  " + d[0].DeskName +" giờ vào là "+ d[0].TimeIn +   " sang bàn " + d1[0].DeskName + " lúc " + date.ToString();
                    InsertOrUpdateOrder(or[0].Id, or[0].OrderDate, deskid, or[0].EmpId, date, or[0].TimeOut,
                                        or[0].Discount, float.Parse(lblTB.Name), or[0].Total, false,note);
                    RT();
                    Load_Desk();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }

        }

        //Khi chọn hủy bàn thì tiến hành hủy và xóa hóa đơn tương ứng cho bàn đó
        private void hủyBànToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có chắc muốn hủy bàn ", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info("Nhan vien: " + name + " huy ban " + lblBan.Text);
                    var d = _deskController.FindById(int.Parse(lblId.Text));
                    UpdateDesk(int.Parse(lblId.Text), d[0].Price, d[0].DeskName, d[0].DeskType, null, false);
                    var o = _order.FindById(int.Parse(lblhd.Text), true);
                    var detail = _detail.GetAll(int.Parse(lblhd.Text));
                    if (detail.Count > 0)
                    {
                        for (int i = 0; i < detail.Count; i++)
                        {
                            detail[i].Deleted = true;
                            _detail.Delete(detail[i]);
                        }
                    }
                    o[0].Deleted = true;
                    if (_order.Delete(o[0]))
                    {
                        MessageBox.Show("Hủy bàn thành công ", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Information);
                        RT();
                        Load_Desk();
                    }
                    else
                    {
                        MessageBox.Show("Không hủy được, lỗi " + _order._err, "Thông báo", MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Question);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        
        #endregion

        #region Các hàm bổ trợ

        //Hiển thị danh sách bàn
        private void Load_Desk()
        {

            flpBan.Controls.Clear();
            var desk = _deskController.GetAll();
            for (int i = 0; i < desk.Count; i++)
            {
                Label lbl = new Label();
                lbl.Size = new Size(64, 64);
                lbl.Name = desk[i].Id.ToString();
                lbl.Text = desk[i].DeskName;
                lbl.ForeColor = Color.White;
                var ma = lbl.Margin;
                ma.All = 10;
                lbl.Margin = ma;
                lbl.ImageList = imageList1;
                lbl.TextAlign = ContentAlignment.MiddleCenter;
                lbl.ContextMenuStrip = contextMenuStrip1;
                lbl.Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Bold);
                if (desk[i].Status)
                    lbl.ImageIndex = 1;
                else
                {
                    lbl.ImageIndex = 0;
                }

                flpBan.Controls.Add(lbl);
                lbl.Click += lbl_Click;
                lbl.MouseHover += lbl_MouseHover;
            }
        }


        

        /// <summary>
        /// Load mặt hàng lên
        /// </summary>
        private void Load_Article()
        {
            art.DataSource = Article.Objects.Where(x => x.Quantity > 0 && x.Deleted == false).ToList();
            art.DisplayMember = "ArtName";
            art.ValueMember = "Id";
        }

      
       

        //Load lại danh sách đồ uống sau khi thêm, cập nhật hoặc xóa
        private void LoadOrderDetail()
        {
            dgvArtChanged.DataSource = new BindingSource { DataSource = _detail.GetAll(int.Parse(lblhd.Text)) };
        }
        
        #endregion

        #region Tính thời gian, tiền
       
       
       
        
        //Tính thời gian đến thời điểm hiện tại cho bàn tương ứng
        private void Total_Cash(DateTime? d1, DateTime? d2,float price)
        {
            try
            {
                if (d1.ToString() != "")
                {
                    var or = _order.FindById(int.Parse(lblhd.Text), true);
                    DateTime a = Convert.ToDateTime(d1);
                    DateTime b = Convert.ToDateTime(d2);
                    TimeSpan sp = b - a;
                    int gio = sp.Days*24 + sp.Hours;
                    lblThoiGian.Text = gio + " giờ " + sp.Minutes + " phút";
                   // float tb = (int.Parse(mang[0]) + float.Parse(mang[1])/60)*price;
                    float aa = (gio + (float)sp.Minutes / 60) * price;
                    float tb=Round(aa);
                    lblTB.Name = tb.ToString();
                    float bt ;
                    if(or[0].Cash.ToString()!="")
                    {
                        lblBT.Name = or[0].Cash.ToString();
                        lblBanTruoc.Text = string.Format("{0:0,0 đồng}", or[0].Cash);
                        bt = or[0].Cash;
                    }
                    else
                    {
                        bt = 0;
                        lblBanTruoc.Text = "O đồng";
                    }
                    lblTienBan.Text = string.Format("{0:0,0 đồng}", tb);
                    lblTienDoUong.Text = string.Format("{0:0,0 đồng}", Load_Cash());
                   // float g = tienban + Load_Cash();
                    float g = tb + Load_Cash() +bt;
                    lblTT.Name = g.ToString();
                    lblT.Name = g.ToString();
                    lblTongTien.Text = g.ToString("#,###");
                    lblTongTien.Text = String.Format("{0:0,0 đồng}", g);
                    lblTong.Text = lblTongTien.Text;
                    lblTienChu.Text = BangChu((decimal) g);
                }
                else
                {
                   RT();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }

        }



        //Hiển thị tiền ở dạng chữ
        public string BangChu(decimal number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            decimal decS = 0;
            //Tung addnew
            try
            {
                decS = Convert.ToDecimal(s.ToString());
            }
            catch
            {

            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;
            return str + "đồng";
        }
        //Làm tròn tiền
        private float Round(float value)
        {
            return (float) Math.Round(value, 1);
        }


        //Tính số tiền đồ uống của bàn tương ứng
        private float Load_Cash()
        {
            if (dgvArtChanged.Rows.Count > 0)
            {
                float tien = 0;
                for (int i = 0; i < dgvArtChanged.Rows.Count - 1; i++)
                {
                    tien += float.Parse(dgvArtChanged.Rows[i].Cells[6].Value.ToString());
                }
                return tien;
            }
            return 0;
        }

        //Số tiền giảm giá
        private void txtGiam_TextChanged(object sender, EventArgs e)
        {
            try
            {

                if (chkPhantram.Checked)
                {
                    int n;
                    if (!int.TryParse(txtGiam.Text, out n))
                        txtGiam.Text = "";
                    else
                    {
                        float a = float.Parse(lblTT.Name) * int.Parse(txtGiam.Text) / 100;
                        lblGiam.Text = String.Format("{0:0,0 đồng}", a);
                        float t = float.Parse(lblTT.Name) - a;
                        lblTong.Text = String.Format("{0:0,0 đồng}", t);
                        lblTienChu.Text = BangChu((decimal)t);
                        lblTG.Name = a.ToString();
                        lblT.Name = t.ToString();
                    }

                }
                else
                {
                    float n = 0;
                    if (!float.TryParse(txtGiam.Text, out n))
                        txtGiam.Text = "";
                    else
                    {
                        lblGiam.Text = String.Format("{0:0,0 đồng}", float.Parse(txtGiam.Text));
                        float t = float.Parse(lblTT.Name) - float.Parse(txtGiam.Text);
                        lblTong.Text = String.Format("{0:0,0 đồng}", t);
                        lblTG.Name = txtGiam.Text;
                        lblT.Name = t.ToString();
                        lblTienChu.Text = BangChu((decimal)t);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }

        }

        private void chkTienThua_CheckedChanged(object sender, EventArgs e)
        {
            if (chkTienThua.Checked)
            {
                txtTienThua.Enabled = true;
            }
            else
            {
                txtTienThua.Enabled = false;
            }
        }

        private void txtTienThua_TextChanged(object sender, EventArgs e)
        {
            float n = 0;
            try
            {
                if (!float.TryParse(txtTienThua.Text, out n))
                    txtTienThua.Text = "";
                else
                {
                    float t = float.Parse(txtTienThua.Text);
                    float t1 = t - float.Parse(lblT.Name);
                    lblTienThua.Text = BangChu((decimal)t1);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }
        }
        #endregion

     

        //In hóa đơn
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            try
            {
                DateTime d = Convert.ToDateTime(lblStart.Text);
                string ngay = "ngày " + d.Day + " tháng " + d.Month + " năm " + d.Year;
                string strDisplay = "Hóa đơn tính tiền";//In dòng tiêu đề, tên quán
                Font fntString = new Font("Times New Roman", 18,FontStyle.Bold);
                e.Graphics.DrawString(strDisplay, fntString,Brushes.Black, 200, 150);

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Đà lạt , ", fntString, Brushes.Black, 400, 190);
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(ngay, fntString, Brushes.Black, 450, 190); //In dòng ngày tháng

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Nhân viên:", fntString, Brushes.Black, 100, 230);//In tiêu đề bàn
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString("Hanzzy", fntString, Brushes.Black, 200, 230); //In tên bàn

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Bàn :", fntString, Brushes.Black, 100, 250);//In tiêu đề bàn
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblBan.Text, fntString, Brushes.Black, 200, 250); //In tên bàn

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Giờ vào:", fntString, Brushes.Black, 100, 270);//In tiêu đề giờ vào
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblStart.Text, fntString, Brushes.Black, 200, 270); //In giờ vào

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Giờ ra:", fntString, Brushes.Black, 100, 290);//In tiêu đề giờ ra
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblStop.Text, fntString, Brushes.Black, 200, 290);//In giờ ra

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Thời gian dùng:", fntString, Brushes.Black, 100, 310);//In tiêu đề giờ ra
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblThoiGian.Text, fntString, Brushes.Black, 200, 310);//In giờ ra

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Tổng tiền bàn:", fntString, Brushes.Black, 100, 330);//In tiêu đề tiền bàn
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblTienBan.Text, fntString, Brushes.Black, 200, 330);

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("CHI TIẾT ĐỒ DÙNG", fntString, Brushes.Black, 280, 350);//In dòng "Chi tiết đồ dùng"

                e.Graphics.DrawString("STT", fntString, Brushes.Black, 100, 370);//In dòng STT
                e.Graphics.DrawString("Đồ dùng", fntString, Brushes.Black, 140, 370);//In dòng "Đồ dùng"
                e.Graphics.DrawString("Giá", fntString, Brushes.Black, 260, 370);//In dòng "Giá"
                e.Graphics.DrawString("Số lượng", fntString, Brushes.Black, 340, 370);//In dòng "Số lượng"
                e.Graphics.DrawString("Thành tiền", fntString, Brushes.Black, 430, 370);//In dòng "Thành tiền"
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                int count = 0;
                for (int i = 0; i < dgvArtChanged.Rows.Count-1; i++)
                {
                    e.Graphics.DrawString((i+1).ToString(), fntString, Brushes.Black, 100, 390 + count);//In dòng STT
                    e.Graphics.DrawString(GetName(int.Parse(dgvArtChanged.Rows[i].Cells[3].Value.ToString())), fntString, Brushes.Black, 140, 390 + count);//In đồ dùng khách đã dùng
                    e.Graphics.DrawString(dgvArtChanged.Rows[i].Cells[5].Value.ToString(), fntString, Brushes.Black, 260, 390 + count);//In giá của đồ dùng
                    e.Graphics.DrawString(dgvArtChanged.Rows[i].Cells[4].Value.ToString(), fntString, Brushes.Black, 340, 390 + count);//In số lượng đồ dùng
                    e.Graphics.DrawString(dgvArtChanged.Rows[i].Cells[6].Value.ToString(), fntString, Brushes.Black, 430, 390 + count);//In thành tiền
                    count += 20;
                }
                e.Graphics.DrawLine(new Pen(Color.Black, 1), 100, 400 + count, 600, 400 + count);//In dấu gạch ngang

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Tổng tiền: ", fntString, Brushes.Black, 300, 420 + count);//In Số tiền được giảm
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblTongTien.Text, fntString, Brushes.Black, 430, 420 + count);//In số tiền được giảm

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Số tiền được giảm: ", fntString, Brushes.Black, 300, 440 + count);//In Số tiền được giảm
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblGiam.Text, fntString, Brushes.Black, 430, 440 + count);//In số tiền được giảm

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Tổng tiền phải trả: ", fntString, Brushes.Black, 300, 460 + count);//In dòng "Tổng tiền sau giảm"
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblTong.Text, fntString, Brushes.Black, 430, 460 + count);//In số tổng số tiền phải trả

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Bằng chữ: ", fntString, Brushes.Black, 300, 480 + count);//In dòng "Tổng tiền sau giảm"
                fntString = new Font("Times New Roman", 10, FontStyle.Regular);
                e.Graphics.DrawString(lblTienChu.Text, fntString, Brushes.Black, 400, 480 + count);//In số tổng số tiền phải trả

                e.Graphics.DrawLine(new Pen(Color.Black, 1), 100, 520 + count, 600, 520 + count);//In dấu gạch ngang

                fntString = new Font("Times New Roman", 10, FontStyle.Bold);
                e.Graphics.DrawString("Đường Sơn Quán Billiard - Đà lạt, 109/1 Nguyễn Công Trứ, Phường 2, Đà Lạt", fntString, Brushes.Black, 100, 530 + count);//In dòng tên quán và địa chỉ

                fntString = new Font("Times New Roman", 8, FontStyle.Italic);
                e.Graphics.DrawString("Kính chào quý khách và hẹn gặp lại", fntString, Brushes.Black, 300, 550 + count);//In dòng "Kính chào quý khách và hẹn gặp lại"

            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }

           
        }

        //Lấy tên sản phẩm theo mã
        private string GetName(int id)
        {
           return Article.Objects.FirstOrDefault(x => x.Id == id).ArtName;
        }



    }
}
